//题目:
// 给定两个字符串 text1 和 text2，返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ，返回 0 。
// 一个字符串的子序列是指这样一个新的字符串：
// 它是由原字符串在不改变字符的相对顺序的情况下删除某些字符（也可以不删除任何字符）后组成的新字符串。

// 例如，"ace" 是 "abcde" 的子序列，但 "aec" 不是 "abcde" 的子序列。
// 两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。


// 示例 1：
// 输入：text1 = "abcde", text2 = "ace" 

// 输出：3  
// 解释：最长公共子序列是 "ace" ，它的长度为 3 。

// 示例 2：
// 输入：text1 = "abc", text2 = "abc"
// 输出：3
// 解释：最长公共子序列是 "abc" ，它的长度为 3 。

// 示例 3：
// 输入：text1 = "abc", text2 = "def"
// 输出：0
// 解释：两个字符串没有公共子序列，返回 0 。
 
#include<iostream>
#include<vector>

using namespace std;

//代码:
class Solution 
{
public:
    int longestCommonSubsequence(string text1, string text2) 
    {
        int m=text1.size(),n=text2.size();
        //1.创建dp表————dp[i][j]表示：text1中的[0,i]子串 与 text2中的[0,j]子串的 最长公共子序列
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        //2.初始化————暂无

        //3.填表————动态转移方程:if(text1[i]==text2[j])dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i][j-1],dp[i-1][j])
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(text1[i-1]==text2[j-1]) dp[i][j]=dp[i-1][j-1]+1;
                else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
        }
        //4.确定返回值
        return dp[m][n];
    }
};